“xx packages are looking for funding”——npm fund 命令及运行机制

在 Node.js 和 npm 生态系统中,开源项目的持续发展和维护常常依赖于贡献者的支持和资助。为了让开发者更容易了解他们依赖的项目哪些有资金支持选项,npm 在6.13.0版本起引入了 npm fund 命令并默认在npm install安装依赖时触发。本文将详细介绍 npm fund 的作用、运行机制、触发时机、如何避免触发以及相关的副作用和改进建议。

什么是 npm fund 命令?

在日常npm install安装依赖的过程中,我们可能都忽略了 command 最后输出的一些信息,比如本文相关的 funding 信息,如:

1
2
3 packages are looking for funding.
Run "npm fund" to find out more.

npm fund 命令是在 npm 6.13.0 版本中首次引入的,旨在帮助开发者识别其项目依赖中可以资助的开源包。运行该命令时,npm 会列出所有包含资助选项的包及其相关链接,便于开发者快速访问这些页面并提供支持。

命令起源

在 2019 年 8 月份时,Standard JS 在其开源项目中内置广告的事件引发热议,这些广告通过一个名为 Fundingnpm 软件包展示在终端,该软件包包含在 Standard 的代码库中。之后 npm 公司宣布将禁止此类终端广告行为。

此事件后,npm 公司表示,它打算在年底前为开源开发人员开发一个众筹平台,于是乎在npm 6.13.0版本上提供了相应支持,这就是npm fund命令的主要由来。

命令作用

  • 显示资助信息npm fund 会扫描项目中的 node_modules 目录,查找每个包的 package.json 文件中是否包含 funding 字段。它会将有资助选项的包及其资助链接列出。
  • 支持开源生态:通过此功能,npm 提高了对开源项目资助的透明度,鼓励开发者参与到开源项目的资助中,帮助维护者获得资金支持。

使用方法

基本用法非常简单,只需在项目根目录中运行:

1
npm fund

命令将输出形如:

1
2
xx packages are looking for funding
run `npm fund` for details

再运行 npm fund,就会显示类似如下的详细信息:

1
package-name   https://example.com/donate

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
├─┬ https://opencollective.com/typescript-eslint
│ │ └── @typescript-eslint/eslint-plugin@4.28.5, @typescript-eslint/experimental-utils@4.28.5, @typescript-eslint/types@4.28.5, @typescript-eslint/typescript-estree@4.28.5, @typescript-eslint/visitor-keys@4.28.5, @typescript-eslint/scope-manager@4.28.5, @typescript-eslint/parser@4.28.5
│ └─┬ https://opencollective.com/eslint
│ │ └── eslint@6.8.0
│ ├── https://github.com/sponsors/epoberezkin
│ │ └── ajv@6.12.6
│ ├── https://github.com/sponsors/sindresorhus
│ │ └── globals@12.4.0, import-fresh@3.3.0, strip-json-comments@3.1.1, ansi-escapes@4.3.2, type-fest@0.21.3, figures@3.2.0, onetime@5.1.2, globby@11.0.4
│ ├── https://github.com/sponsors/isaacs
│ │ └── glob@7.2.3
│ ├─┬ https://github.com/chalk/chalk?sponsor=1
│ │ │ └── chalk@4.1.2
│ │ └── https://github.com/chalk/ansi-styles?sponsor=1
│ │ └── ansi-styles@4.3.0
│ └── https://github.com/sponsors/ljharb
│ └── minimist@1.2.8, is-generator-function@1.0.9, qs@6.11.2, side-channel@1.0.4, call-bind@1.0.2, get-intrinsic@1.1.1, has-symbols@1.0.2, object-inspect@1.11.0
├── https://github.com/sponsors/RubenVerborgh
│ └── follow-redirects@1.15.2
└── https://ko-fi.com/tunnckoCore/commissions
└── formidable@1.2.2

npm fund 的运行机制和触发时机

运行机制

  • 依赖扫描npm fund 会读取 node_modules 中每个依赖包的 package.json 文件,寻找 funding 字段。如果找到了该字段,它会提取并显示相关的资助信息。

    • 字段格式:funding 字段可以是 URL 字符串或更复杂的对象,指向资助页面。例如:
      1
      2
      3
      {
      "funding": "https://example.com/donate"
      }

    或者

    1
    2
    3
    4
    5
    6
    {
    "funding": {
    "type": "individual",
    "url": "https://example.com/donate"
    }
    }

触发时机

  • npm install 提示:在安装项目依赖时,如果项目中存在可以资助的包,npm 会显示类似“xx packages are looking for funding”的提示,提醒开发者可以运行 npm fund 查看详细信息。(这也是我们日常主要触发的时机)
  • 显式调用:开发者可以手动运行 npm fund 命令,以查看当前项目中支持资助的所有包和资助链接。

如何避免 npm fund 的触发?

在某些情况下,开发者或企业可能希望在 npm install 过程中避免看到这些资助提示。以下是两种实现方式:

1. 在安装时使用 --no-fund 参数

直接在运行 npm install 时添加 --no-fund 参数:

1
npm install --no-fund

2. 修改 .npmrc 配置文件

.npmrc 文件中加入以下配置来永久禁用资助提示:

1
fund=false

此配置可以放在项目的根目录下(项目下的.npmrc文件),仅作用于当前项目;也可以放在用户主目录(~/.npmrc文件),作用于全局。

*可以通过npm config ls -l查看当前项目的npm配置,默认情况下fund配置会被设置为true

禁用 npm fund 的副作用

优点:

  • 简洁输出:禁用 npm fund 提示可以减少 npm install 的输出信息,使终端显示更加清晰。
  • 减少干扰:在企业级项目中,开发者可能更专注于安装过程和依赖的调试,不需要额外的资助提示。

缺点:

  • 支持意识减弱:禁用该提示后,开发者不再会注意到可以资助的依赖,可能错失支持有价值的开源项目的机会。
  • 透明度降低:新加入的团队成员或不熟悉项目的开发者可能不知道项目中有哪些包有资助选项。
  • 开源支持意识降低:从长远来看,减少对资助信息的提示可能会让开发者对支持开源项目的重要性淡化,从而减少对依赖项目的贡献和支持。

npm fund 源码

源码文件:https://github.com/npm/cli/blob/latest/lib/commands/fund.js

以目前(2024-11)的源码内容来看,其源码机制概括来说是先使用 npm 的内部模块库函数来遍历 node_modules 目录,读取 package.json 并检查是否有 funding 字段,最后将所有符合条件的包信息格式化输出到终端。

代码流程总结:

  • 1.读取依赖树:使用 Arborist 加载项目的依赖树。
  • 2.解析资助信息:通过 libnpmfundreadTree 方法提取资助信息。
  • 3.输出格式化:根据用户配置输出 JSON 格式或使用 archy 进行可读格式的输出。
  • 4.链接打开:当提供了包名时,openFundingUrl 会尝试在浏览器中打开该包的资助链接。

最后

npm fundnpm 引入的一个有用的命令,帮助开发者支持开源项目并维持开源生态的可持续发展。虽然在某些情况下禁用它有其合理性,但在默认情况下保留该提示可以提高团队对开源项目支持的意识。根据项目和团队的实际需求,开发者可以灵活选择是否禁用 npm fund 提示。


相关链接